package br.com.iswe.gerador.velocity.info;

import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Date;

import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

import br.com.iswe.core.entidades.ObjetoBase;
import br.com.iswe.core.entidades.annotation.GeradorConfig;
import br.com.iswe.core.entidades.info.InfoEntidade;
import br.com.iswe.core.entidades.info.InfoPropriedade;

@SuppressWarnings("unchecked")
public class InfoPropriedadeImpl extends InfoPropriedade {

	public InfoPropriedadeImpl(Method mth, InfoEntidade infoEntidade) {
		super(mth, infoEntidade);
	}

	@Override
	public InfoEntidadeImpl getInfoEntidade() {
		return (InfoEntidadeImpl)super.getInfoEntidade();
	}
	
	protected Integer mapearTipo(Method mth, Class mthClazz) {
		if(Number.class.isAssignableFrom(mthClazz)){
			return TIPO_NUMERO;
		}
		else if(Date.class.isAssignableFrom(mthClazz)){
			return TIPO_DATA;
		}
		else if(ObjetoBase.class.isAssignableFrom(mthClazz)){
			setObjRef(InfoEntidadeImpl.getInstance(mthClazz));
			return TIPO_OBJ_REF;
		}
		else if(Collection.class.isAssignableFrom(mthClazz)){
			OneToMany oneToMany = mth.getAnnotation(OneToMany.class);
			if(oneToMany != null){
				Class targetEntity = oneToMany.targetEntity();
				//Marca a entidade de destino, de forma q sua persistencia seja
				//feita pelo mestre.
				InfoEntidadeImpl objRef = InfoEntidadeImpl.getInstance(targetEntity);
				setObjRef(objRef);
				return TIPO_COLL_REF_DETAIL;
			}
			ManyToMany manyToMany = mth.getAnnotation(ManyToMany.class);
			if(manyToMany != null){
				Class targetEntity = manyToMany.targetEntity();
				setObjRef(InfoEntidadeImpl.getInstance(targetEntity));
				return TIPO_COLL_REF;
			}
		}
		else if(Boolean.class.isAssignableFrom(mthClazz)){
			return TIPO_BOOLEAN;
		}
		geradorConfig = mth.getAnnotation(GeradorConfig.class);
		if(geradorConfig != null && geradorConfig.campoSenha()){
			return TIPO_SENHA;
		}
		return TIPO_TEXTO;
	}
}
